home *** CD-ROM | disk | FTP | other *** search
/ IRIX Installation Tools & Overlays 2001 November / SGI IRIX Installation Tools & Overlays 2001 November - Disc 1.iso / dist / roboinst.idb / usr / etc / bootpadd.z / bootpadd
Text File  |  2001-10-10  |  5KB  |  233 lines

  1. #! /bin/sh -f
  2.  
  3. # Copyright 1997-2000, Silicon Graphics, Inc.
  4. # All Rights Reserved.
  5. #
  6. # This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  7. # the contents of this file may not be disclosed to third parties, copied or
  8. # duplicated in any form, in whole or in part, without the prior written
  9. # permission of Silicon Graphics, Inc.
  10. #
  11. # RESTRICTED RIGHTS LEGEND:
  12. # Use, duplication or disclosure by the Government is subject to restrictions
  13. # as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  14. # and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  15. # successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  16. # rights reserved under the Copyright Laws of the United States.
  17.  
  18. # bootpadd
  19. # add an entry to /usr/etc/bootptab
  20. #
  21. # if any attribute is omitted from the command line, they are
  22. # determined by first looking for an entry for the specified
  23. # host in the /usr/etc/bootptab file, then by system calls
  24. #
  25. # host    htype     haddr          iaddr          bootfile
  26. # IRIS   1  01:02:03:8a:8b:8c   192.0.2.1      unix
  27.  
  28. usage="usage: bootpadd [ -nq ] -h haddr -i iaddr -b bootfile hostname"
  29.  
  30. PATH=/sbin:/usr/bin:/usr/bsd:/usr/sbin:/etc:/usr/etc:
  31.  
  32. test "$TMPDIR" = "" && {
  33.     TMPDIR=/tmp
  34.     export TMPDIR
  35. }
  36.  
  37. HTYPE=1
  38. BOOTFILE=unix
  39. BOOTPTAB=/etc/bootptab
  40. if test ! -f $BOOTPTAB ; then
  41.     BOOTPTAB=/usr/etc/bootptab
  42. fi
  43. GETHOSTBYNAME=/usr/etc/gethostbyname
  44. DBGOUT=-
  45. DEBUG=:
  46. ECHO=echo
  47. ERROR=echo
  48. TMPFILE=$TMPDIR/bootpadd.$$
  49.  
  50. #
  51. # Process options and arguments
  52. #
  53.  
  54. bootfile=""
  55. debugmode=""
  56. haddr=""
  57. iaddr=""
  58. dryrun=""
  59. while getopts b:dh:i:nq OPT; do
  60.     case $OPT in
  61.     b)  bootfile="$OPTARG";;
  62.     d)  DEBUG=echo; DBGOUT=1; debugmode=debug;;
  63.     h)  haddr="$OPTARG";;
  64.     i)  iaddr="$OPTARG";;
  65.     n)  dryrun=yes;;
  66.     q)  ECHO=:;;
  67.     *)  $ERROR $usage; exit 2
  68.     esac
  69. done
  70. shift `expr $OPTIND - 1`
  71.  
  72. #
  73. # ---- define subroutines ----
  74. #
  75.  
  76. # get the IP address for a given host ($1)
  77. # returns the IP address in IPADDR global variable
  78. # returns 1 if got a name
  79.  
  80. getipaddr()
  81. {
  82.     hostname="$1"
  83.  
  84.     if [ ! -x $GETHOSTBYNAME ]; then
  85.     $ERROR "$GETHOSTBYNAME not installed, aborting"
  86.     exit 1
  87.     fi
  88.  
  89.     IPADDR=`$GETHOSTBYNAME $hostname | \
  90.         nawk -v a=0 '/^'$hostname' / { a=\$3; exit }
  91.                     END      { print a }'`
  92. }
  93.  
  94. # $1 is hostname to match
  95.  
  96. getbootp()
  97. {
  98.     hostname="$1"
  99.  
  100.     # create temporary nawk program
  101.     echo "BEGIN { found=0 }
  102.     /^%%/ { found=1 }
  103.     found == 0 || \$1 != \"$hostname\" { continue }
  104.     NF > 3 { print \$0 ; exit }" > $TMPFILE
  105.     line=`nawk -f $TMPFILE $BOOTPTAB`
  106.     rm -f $TMPFILE >/dev/null 2>&1
  107.  
  108.     if [ "$line" = "" ]; then
  109.     echo ""
  110.     return 1
  111.     fi
  112.  
  113.     echo $line
  114. }
  115.  
  116. #
  117. # ---- end functions ----
  118. #
  119.  
  120. # get hostname, strip domain name if specified
  121.  
  122. if [ $# != 1 ]; then
  123.     $ERROR $usage
  124.     exit 2;
  125. fi
  126.  
  127. HOSTNAME=`echo $1 | nawk -F. '{print $1}'`
  128.  
  129. if test ! -s $BOOTPTAB ; then
  130.     $ERROR "$BOOTPTAB does not exist, aborting"
  131.     exit 1
  132. fi
  133.  
  134. BOOTPINFO=`getbootp $HOSTNAME`
  135. if [ "$BOOTPINFO" != "" ]; then
  136.     $ECHO "Overwriting entry for $HOSTNAME in $BOOTPTAB"
  137. fi
  138.  
  139. # determine default bootfile
  140.  
  141. if [ "$bootfile" = "" ]; then
  142.     # first check bootptab
  143.     bootfile=`echo $BOOTPINFO | nawk '{print $5}'`
  144.     $DEBUG "Using bootfile $bootfile from $BOOTPTAB"
  145. fi
  146.  
  147. if [ "$bootfile" = "" ]; then
  148.     # then use default
  149.     bootfile=`nawk \
  150.     'BEGIN { count=0 }
  151.     /^[^#]/ && $NF != 0 {
  152.         if (count==1) { print $0; exit }
  153.         count++
  154.     }
  155.     /^%%/ { exit }' $BOOTPTAB`
  156.     $DEBUG "bootptab default bootfile is $bootfile"
  157.     if [ "$bootfile" = "" ]; then
  158.     bootfile=$BOOTFILE
  159.     fi
  160.     $DEBUG "default bootfile is $bootfile"
  161. fi
  162.  
  163. # get internet address of host
  164.  
  165. if [ "$iaddr" = "" ]; then
  166.     # first check bootptab
  167.     iaddr=`echo $BOOTPINFO | nawk '{print $4}'`
  168.     $DEBUG "Using iaddr $iaddr from $BOOTPTAB"
  169. fi
  170.  
  171. if [ "$iaddr" = "" ]; then
  172.     # query database
  173.     getipaddr $HOSTNAME
  174.     if [ "$IPADDR" = "0" ]; then
  175.     $ERROR "Unable to get IP address for $HOSTNAME, aborting"
  176.     exit 1
  177.     fi
  178.     iaddr=$IPADDR
  179.     $DEBUG "Using IP address $iaddr"
  180. fi
  181.  
  182. # get hardware (ethernet) address of host
  183.  
  184. if [ "$haddr" = "" ]; then
  185.     # first check bootptab
  186.     haddr=`echo $BOOTPINFO | nawk '{print $3}'`
  187.     $DEBUG "Using haddr $haddr from $BOOTPTAB"
  188. fi
  189.  
  190. if [ "$haddr" = "" ]; then
  191.     # query client
  192.     haddr=`/usr/bsd/rsh $HOSTNAME -n nvram eaddr 2>/dev/null | nawk '/..:..:..:..:..:../ { print $0 }'`
  193.     if [ "$haddr" = "" ]; then
  194.     $ERROR "Unable to get hardware address for $HOSTNAME, aborting"
  195.     exit 1
  196.     fi
  197.     $DEBUG "Using hardware address $haddr"
  198. fi
  199.  
  200. # done with initialization,
  201. # we now have all info for bootptab entry,
  202. # update bootptab info
  203.  
  204. if [ "$dryrun" = "yes" ]; then
  205.    exit 0
  206. fi
  207.  
  208. nawk "BEGIN { found=0 }
  209.     /^%%/ { found=1 }
  210.     found == 0 || \$1 != \"$HOSTNAME\" { print \$0 }" $BOOTPTAB >$BOOTPTAB.N
  211. if test ! -s $BOOTPTAB.N ; then
  212.     exit 1
  213. fi
  214. if test -x /usr/bin/printf; then
  215.     /usr/bin/printf "%-15s 1 %-21s %-15s %s\n" $HOSTNAME $haddr $iaddr $bootfile >>$BOOTPTAB.N
  216. else
  217.     echo "$HOSTNAME 1 $haddr $iaddr $bootfile" >>$BOOTPTAB.N
  218. fi
  219.  
  220. rm -f $BOOTPTAB.O >/dev/null 2>&1
  221. mv $BOOTPTAB $BOOTPTAB.O || {
  222.     $ERROR "Cannot write backup file $BOOTPTAB.O"
  223.     exit 1
  224. }
  225.  
  226. mv $BOOTPTAB.N $BOOTPTAB || {
  227.     $ERROR "Cannot save new bootptab file $BOOTPTAB"
  228.     mv $BOOTPTAB.O $BOOTPTAB
  229.     exit 1
  230. }
  231.  
  232. $ECHO "Added $HOSTNAME to $BOOTPTAB"
  233.